package com.atguigu.user.service.impl;

import com.atguigu.constants.UserConstants;
import com.atguigu.param.UserCheckParam;
import com.atguigu.param.UserLoginParam;
import com.atguigu.pojo.User;
import com.atguigu.user.service.UserService;
import com.atguigu.user.service.mapper.UserMapper;
import com.atguigu.utils.MD5Util;
import com.atguigu.utils.R;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * 用户业务实现类
 */

@Slf4j
@Service

public class UserServiceImpl implements UserService {

    @Autowired
//    @Autowired(required = false)
    private UserMapper userMapper;

    /**
     * 检查账号是否可用业务
     *
     * @param userCheckParam 账号参数 已经校验完毕
     * @return 检查结果 001  004
     */

    @Override
    public R check(UserCheckParam userCheckParam) {
        // 1 参数封装
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        // 查询 user_name的值
        queryWrapper.eq("user_name", userCheckParam.getUserName());

        // 2 数据库查询
        Long total = userMapper.selectCount(queryWrapper);

        // 3 查询结果处理
        if (total == 0) {
            // 数据库中不存在,可用
            log.info("UserServiceImpl.check业务结束，结果:{}", "账号可以使用!");
            return R.ok("账号不存在,可以使用!");
        }


        log.info("UserServiceImpl.check业务结束，结果:{}", "账号不可使用!");

        return R.fail("账号已经存在,不可注册!");
    }


    /**
     * 注册业务
     * 1. 检查账号是否存在
     * 2. 密码加密处理
     * 3. 插入数据库数据
     * 4. 返回结果封装
     *
     * @param user 参数已经效验吗，但是密码是明文
     * @return 结果 001  004
     */
    @Override
    public R register(User user) {
        // 1. 检查账号是否存在
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        // 查询 user_name的值
        queryWrapper.eq("user_name", user.getUserName());

        // 数据库查询
        Long total = userMapper.selectCount(queryWrapper);

        if (total > 0) {
            log.info("UserServiceImpl.register业务结束，结果:{}", "账号存在,注册失败!");
            return R.fail("账号已经存在,不可注册!");
        }

        // 2. 密码加密处理
        /**
         * MD5 不可逆转的加密方式，无法解密 加密后是固定的密文
         * 设置的密码保存 是一段密文，输入的密码对比 密文 是否一样
         *
         * 可以暴力破解 给密码设置后缀 俗称盐 来曾增加破解难度
         *
         */
        String newPwd = MD5Util.encode(user.getPassword() + UserConstants.USER_SLAT);
        user.setPassword(newPwd);

        // 3. 插入数据库数据
        int rows = userMapper.insert(user);

        // 4. 返回结果封装
        if (rows == 0) {
            log.info("UserServiceImpl.register业务结束，结果:{}", "数据插入失败!注册失败!");
            return R.fail("注册失败!请稍后再试!");
        }

        log.info("UserServiceImpl.register业务结束，结果:{}", "注册成功!");

        return R.ok("注册成功!");
    }


    /**
     * 登录业务
     * 1.密码处理
     * 2.数据库查询
     * 3.结果处理
     *
     * @param userLoginParam @return 结果 001  004
     * @return
     */
    @Override
    public R login(UserLoginParam userLoginParam) {
        // 1.密码处理
        String newPwd = MD5Util.encode(userLoginParam.getPassword() + UserConstants.USER_SLAT);

        // 2.数据库查询
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("user_name", userLoginParam.getUserName());
        queryWrapper.eq("password", newPwd);

        User user = userMapper.selectOne(queryWrapper);

        // 3.结果处理
        if (user == null) {
            log.info("UserServiceImpl.login业务结束，结果:{}", "账号和密码错误!");
            return R.fail("账号或者密码错误!");
        }

        log.info("UserServiceImpl.login业务结束，结果:{}", "登录成功!");
        // 不返回password属性!
        user.setPassword(null);
        return R.ok("登录成功!", user);
    }
}
